//
//  WBComposeTextView.swift
//  DXWeibo
//
//  Created by dx on 17/1/27.
//  Copyright © 2017年 dx. All rights reserved.
//

import UIKit

/// 撰写微博的文本视图
class WBComposeTextView: UITextView {

    /// 占位标签
    fileprivate lazy var placeholderLabel = UILabel()
    
    override func awakeFromNib() {
        setupUI()
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    // MARK: - 通知监听方法
    @objc fileprivate func textChanged() {
        placeholderLabel.isHidden = self.hasText
    }
}

// MARK: - 表情键盘专属方法
extension WBComposeTextView {
    
    /// 向文本视图插入表情符号
    func insertEmoticon(em: CZEmoticon?) {
        
        // 1. em == nil 删除按钮
        guard let em = em else {
            
            // 删除文本
            deleteBackward()
            
            return
        }
        
        // 2. emoji 字符串
        if let emoji = em.emoji, let textRange = selectedTextRange {
            
            // UITextRange 仅用在此处
            replace(textRange, withText: emoji)
            
            return
        }
        
        // 0. 获取表情中的图像属性文本
        // 所有的排版系统中，几乎都有一个共同的特点，插入的字符的显示，跟随前一个字符的属性，本身并没有'属性'
        let imageText = em.imageText(font: font!)
        
        // 1. 获取当前 textView 属性文本（可变的）
        let attrStrM = NSMutableAttributedString(attributedString: attributedText)
        
        // 2. 将图像的属性文本 插入到当前的光标位置
        attrStrM.replaceCharacters(in: selectedRange, with: imageText)
        
        // 3. 重新设置属性文本
        // 记录光标位置
        let range = selectedRange
        // 设置文本
        attributedText = attrStrM
        // 恢复光标位置
        selectedRange = NSRange(location: range.location + 1, length: 0)
        
        // ** 手动调用代理方法和通知方法！！！
        // 4. 让代理执行文本变化方法
        delegate?.textViewDidChange?(self)
        
        // 5. 执行当前对象的文本变化方法
        textChanged()
    }
    
    /// 返回 textView 对应的纯文本字符串
    var emoticonText: String {
        
        // 1. 获取 textView 的属性文本
        guard let attrStr = attributedText else {
            return ""
        }
        
        // 2. 需要获得属性文本中的图片[附件]
        var result = String()
        attrStr.enumerateAttributes(in: NSRange(location: 0, length: attrStr.length), options: []) { (dict, range, _) in
            
            if let attachment = dict["NSAttachment"] as? CZEmoticonAttachment {
                result += attachment.chs ?? ""
            } else {
                let subStr = (attrStr.string as NSString).substring(with: range)
                result += subStr
            }
            
        }
        
        return result
    }
}

private extension WBComposeTextView {
    
    func setupUI() {
        
        // 0. 注册通知
        NotificationCenter.default.addObserver(self, selector: #selector(textChanged), name: NSNotification.Name.UITextViewTextDidChange, object: self)
        
        // 1. 设置占位标签
        placeholderLabel.text = "分享新鲜事..."
        placeholderLabel.font = self.font
        placeholderLabel.textColor = UIColor.lightGray
        placeholderLabel.sizeToFit()
        placeholderLabel.frame.origin = CGPoint(x: 5, y: 8)
        addSubview(placeholderLabel)
    }
}
